package language.advanced.functional;

import lombok.Getter;
import lombok.Setter;

import java.util.function.Supplier;
import java.util.stream.Stream;

//JDK1.8 supplier,是用来在函数式编程中创建对象的
//调用get()方法，此时会调用对象的构造方法，即获得到真正对象
public class supplierTest {
    public static void main(String[] args) {
        //String::new  代表 String的new方法，是一个匿名函数
        Supplier<String> supplierString = String::new;  //supl$$Lambda$1/159413332@133314b

        //调用supplier.get()生成一个新对象，每次get都会调用构造方法，获取的对象不同
        System.out.println(supplierString.get());//返回一个空字符串

        Supplier<Emp> supplierEmp = Emp::new;
        Emp emp = supplierEmp.get();   //生成一个Emp对象
        emp.setName("EmpName");
        System.out.println(emp.getName());

        Supplier<Emp> supplierEmpWithName = ()-> new Emp("withName");
        Emp empwithName = supplierEmpWithName.get();   //生成一个Emp对象
        System.out.println(empwithName.getName());

        //在函数式编程中使用supplier生成对象,生成的每个对象都不一样
        //public static<T> Stream<T> generate(Supplier<T> s) 调用一次
        Stream.generate(supplierEmp)
                .limit(5)
                .forEach(System.out::println);

    }

    @Getter
    @Setter
    public static class Emp {
        private String name;

        public Emp() {
        }

        public Emp(String name) {
            this.name = name;
        }
    }
}
